unit Uroteiro;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Mask, ComCtrls, MaskUtils, ExtCtrls,IniFiles, Buttons;

  type
        RegProduto = record
        Codigo: string[13];
        Descricao: string[219];
        Preco: string[9];
        Taxa: string[3];
        UM: string[3];
    end;

  type
        Base = record
        Sequencial: char;
        Tarefa: array [0..1] of char;
        Tipo: char;
    end;

  type
        RespostaECF = record
        Sequencial: char;
        Tarefa: array [0..1] of char;
        Tipo: char;
        mensagem: array [0..3] of char;
        operacional: char;
        documento: char;
        sinalizadores: array [0..4] of char;
        adicional: array [0..79] of char;
    end;

  type
        StatusECF = record
        Sequencial: char;
        Tarefa: array [0..1] of char;
        Tipo: char;
        secao: array [0..3] of char;
        informacao: array [0..1188] of char;
    end;

  type
        OnLine = record
        Sequencial: char;
        Tarefa: array [0..1] of char;
        Tipo: char;
        controle: char;
        informacao: array [0..512] of char;
    end;
    Type Modal = array[0..19] of array [0..20] of char;
    Type aicms= array[0..15] of array [0..3] of char;

type
        TotalVenda = record
        Documento : Char;
        Status_venda: Char;
        COO : Array [0..5] of char;
        Itens_registrados : Array[0..3] of char;
        Venda_Bruta: Array[0..12] of char;
        Venda_Liquida: Array[0..12] of char;
        Total_a_pagar: Array[0..12] of char;
        Total_pago: Array[0..12] of char;
        Troco: Array[0..12] of char;
end;
type
        tipo_I1 = record
        marca : array[0..20] of char;
        modelo: array[0..20] of char;
        tipo  : array[0..7] of char;
        serie: array[0..21] of char;
        firmware: array[0..8] of char;
        protocolo:Char;
end;

type
        tipo_S1 = record
        versao: array[0..3] of char;
        serie: array[0..21] of char;
        dt_inicializacao: array[0..10] of char;
        hr_inicializacao: array[0..9] of char;
        status: array[0..2] of char;
        capacidade:array[0..4] of char;
        PonteiroA:array[0..8] of char;
        PonteiroB:array[0..8] of char;
        modelo:array[0..20] of char;
        serie_ecf:array[0..21] of char;
        CNPJ:array[0..20] of char;
        IE:array[0..20] of char;
        IM:array[0..20] of char;
        dt_instalacao:array[0..10] of char;
        hr_instalacao:array[0..9] of char;
end;
type
  TFormRoteiro = class(TForm)
    Porta: TGroupBox;
    Timeout: TLabel;
    Com1: TRadioButton;
    Com2: TRadioButton;
    Com3: TRadioButton;
    Com4: TRadioButton;
    Tempo: TMaskEdit;
    Com5: TRadioButton;
    GroupBox31: TGroupBox;
    LabelPorta: TLabel;
    v1: TRadioButton;
    v2: TRadioButton;
    v3: TRadioButton;
    v4: TRadioButton;
    v5: TRadioButton;
    Button2: TButton;
    PageControl1: TPageControl;
    Barra: TStatusBar;
    Timer1: TTimer;
    Venda: TTabSheet;
    Label5: TLabel;
    EdProduto: TMaskEdit;
    Button3: TButton;
    Label6: TLabel;
    EdDescricao2: TMemo;
    Label7: TLabel;
    EdRepete: TMaskEdit;
    Label8: TLabel;
    EdTaxa2: TComboBox;
    Label9: TLabel;
    Edpagamento: TComboBox;
    CancelaItem: TTabSheet;
    RB_cancela1item: TRadioButton;
    RB_cancelatodos: TRadioButton;
    Button1: TButton;
    Label10: TLabel;
    Ednitem: TMaskEdit;
    SpeedButton1: TSpeedButton;
    Label11: TLabel;
    EdPreco2: TMaskEdit;
    Label12: TLabel;
    EdQtde: TMaskEdit;
    LMF: TTabSheet;
    Label13: TLabel;
    EdParamIni: TMaskEdit;
    Label14: TLabel;
    EdparamFim: TMaskEdit;
    RB_MF_Data: TRadioButton;
    RB_MF_RZ: TRadioButton;
    Button4: TButton;
    MF_Simplificada: TCheckBox;
    ECF: TTabSheet;
    Memo1: TMemo;
    CancCupom: TTabSheet;
    Button6: TButton;
    LTX: TTabSheet;
    Button7: TButton;
    Label15: TLabel;
    Label16: TLabel;
    RDZ: TTabSheet;
    Label17: TLabel;
    EdDataZ: TMaskEdit;
    Label18: TLabel;
    EdHoraz: TMaskEdit;
    CB_HVerao: TCheckBox;
    Button8: TButton;
    MFD: TTabSheet;
    RB_MFD_Data: TRadioButton;
    RB_MFD_COO: TRadioButton;
    EdParamIniMFD: TMaskEdit;
    EdParamFImMFD: TMaskEdit;
    Button9: TButton;
    Button10: TButton;
    CBCaptura: TCheckBox;
    ProgressBar1: TProgressBar;


    procedure Button2Click(Sender: TObject);
    procedure BtDescartarClick(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure EdRepeteExit(Sender: TObject);
    procedure EdnitemExit(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure SpeedButton1Click(Sender: TObject);
    procedure EdPreco2Exit(Sender: TObject);
    procedure EdQtdeExit(Sender: TObject);
    procedure RB_MF_DataClick(Sender: TObject);
    procedure RB_MF_RZClick(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure PageControl1Change(Sender: TObject);
    procedure Button8Click(Sender: TObject);
    procedure RDZShow(Sender: TObject);
    procedure RB_MFD_DataClick(Sender: TObject);
    procedure RB_MFD_COOClick(Sender: TObject);
    procedure Button9Click(Sender: TObject);
    procedure Button10Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
        procedure CapturaStatus;
        function MensagemError(CodError:string):String;
        Function MandaComando:Boolean;
        function ObtemResposta:Boolean;
  end;

Const
        Acentuacao = 'áéíóúÁÉÍÓÚàèìòùÀÈÌÒÙâêîôûÂÊÎÔÛäëïöüÄËÏÖÜãÃõÕñÑ_áéíóúÁÉÍÓÚàèìòùÀÈÌÒÙâêîôûÂÊÎÔÛäëïöüÄËÏÖÜãÃõÕñÑ_áéíóúÁÉÍÓÚàèìòùÀÈÌÒÙâêîôûÂÊÎÔÛäëïöüÄËÏÖÜãÃõÕñÑ_áéíóúÁÉÍÓÚàèìòùÀÈÌÒÙâêîôûÂÊÎÔÛäëïöüÄËÏÖÜãÃõÕñÑ';
        maximo  = '999999,99';
        qtde999 = '9999';
var
  FormRoteiro: TFormRoteiro;
  Comando : array[0..512] of Char;      // Buffer de transmissao
  Resposta:array[0..1200] of Char;       // Buffer de recepcao
  Conteudo: RespostaECF;        // Retorno dos comandos (exceto status)
  Status: StatusECF;            // Retorno dos comandos de Status
  LeituraOnLine:Online;         // Retorno da captura de texto online
  retorno:longint;              // Retorno das funcoes ECFWriteSerial e ECFReadSerial
  pagamento:Modal;              // legendas dos meios de pagamento
  StatusDocumento:TotalVenda;   // Totais do cupom fiscal
  StatusModelo:Tipo_I1;      // Dados do modelo de ECF + versão etc
  StatusMFD:Tipo_S1;         // Dados da MFD: serie, capacidade etc
  aliquota_icms, ALiquota_Iss:aicms;          // aliquotas de icms
  Header:Base;
  capacidadeb,consumob, consumop: real; // variaveis para apurar o % de consumo da MFD


  Function ECFOpenSerial(Numero,Velocidade,Timeout,log, mostra:Integer; mensagem:string): longint; Stdcall; External 'SerialMFD.dll';
  Function ECFWriteSerial(Comando:Pchar;Tamanho:Longint;mensagem:String):longint; Stdcall;External 'SerialMFD.dll';
  Function ECFReadSerial(Status:Pchar;Tamanho:longint;mensagem:String):longint; Stdcall;External 'SerialMFD.dll';
  procedure ECFCloseSerial; Stdcall;External 'SerialMFD.dll';

implementation

uses aviso, TextoOnLine;

{$R *.dfm}

procedure TFormRoteiro.Button2Click(Sender: TObject);
var velocidade,tt, numporta: Integer;
begin
     PageControl1.Visible:=false;
     Memo1.Clear;
        
     numporta:=1;
     if Com1.Checked then numporta:=1
     else if com2.checked then numporta:=2
     else if com3.checked then numporta:=3
     else if com4.checked then numporta:=4
     else if com5.checked then numporta:=5
     else com1.checked:=true;

     velocidade:=9600;
     if V1.Checked then Velocidade:=9600
     else if v2.checked then velocidade:=19200
     else if v3.checked then velocidade:=38400
     else if v4.checked then velocidade:=57600
     else if v5.checked then velocidade:=115200
     else v1.checked:=true;

     ECFCloseSerial;   

     TT:=StrToInt(Tempo.Text);
     if ECFOpenSerial(numporta,velocidade,TT,1,1,'serial') <> 0 then
     begin
          ShowMEssage('Erro na Abertura da Porta!');
          LabelPorta.Caption:=' ';
          Com1.Checked:=False;
     end
     else Begin
             FormRoteiro.Height:=634;
             FormRoteiro.Position:=poScreenCenter;
             LabelPorta.Caption:='Porta ABERTA =='+IntToSTr(numporta);
             CapturaStatus;
             PageControl1.ActivePage:=ECF;
             PageControl1.Visible:=True;
     end;
end;
procedure TFormRoteiro.CapturaStatus;
var i:integer; // variaveis para loop

begin
        Barra.Panels[2].Text:='Capturando informações do modelo';
        StrPCopy(Comando,'*34|I1');
        if not MandaComando then exit;
        memo1.Lines.Add('Marca: '+StatusModelo.marca);
        memo1.Lines.Add('Modelo: '+StatusModelo.modelo);
        memo1.Lines.Add('Tipo: '+StatusModelo.tipo);
        memo1.Lines.Add('No. de Série: '+StatusModelo.Serie);
        memo1.Lines.Add('Firmware: '+StatusModelo.firmware);
        memo1.Lines.Add('Protocolo: '+StatusModelo.protocolo);

        memo1.Lines.Add(' ');

        Barra.Panels[2].Text:='Capturando informações da MFD';
        StrPCopy(Comando,'*34|S1');
        if not MandaComando then exit;

        capacidadeb:=StrtoFloat(StatusMFD.Capacidade) * 1024 * 1024;
        consumob:=StrToFloat(StatusMFD.PonteiroA)  + StrToFloat(StatusMFD.PonteiroB);
        consumop:=(Consumob / Capacidadeb)*100;

        memo1.Lines.Add('MFD: '+StatusMFD.serie);
        memo1.Lines.Add('CNPJ: '+StatusMFD.CNPJ);
        memo1.Lines.Add('I.E.: '+StatusMFD.IE);
        memo1.Lines.Add('I.M.: '+StatusMFD.IM);
        memo1.Lines.Add(' ');
        memo1.Lines.Add('Capacidade: '+StatusMFD.capacidade+' MB');
        memo1.Lines.Add('Consumo: '+floattostr(consumob)+' bytes ('+Formatfloat ('0.00',consumop)+' %)');

        Barra.Panels[2].Text:='Capturando os meios de pagamento';
        StrPCopy(Comando,'*34|B4');
        if not MandaComando then exit;

        for i:=1 to 20 do EdPagamento.Items.Add(FormatFloat('00',i)+'-'+Pagamento[i-1]); // captura os meios de pagamento


        // Obtem as alíquotas programadas para ICMS
        Barra.Panels[2].Text:='Capturando as alíquotas de ICMS';
        StrPCopy(Comando,'*34|D4');
        if not MandaComando then exit;
        try
                for i:=1 to 15 do
                begin
                        EdTaxa2.Items.Add('T'+FormatFloat('00.00',StrtoFloat(aliquota_ICMS[i-1])/100)+'%'); // captura os meios de pagamento
                end
        except
        end;

        // Obtem as alíquotas programadas para ISS
        StrPCopy(Comando,'*34|E4');
        if not MandaComando then exit;
        try
                for i:=1 to 15 do
                begin
                        EdTaxa2.Items.Add('S'+FormatFloat('00.00',StrtoFloat(aliquota_ISS[i-1])/100)+'%'); // captura os meios de pagamento
                end
        except
        end;
end;
procedure TFormRoteiro.BtDescartarClick(Sender: TObject);
begin
        PageControl1.Visible:=False;
end;

procedure TFormRoteiro.Timer1Timer(Sender: TObject);
begin
     Barra.Panels[0].Text:='Data: '+DateToStr(Date);
     Barra.Panels[1].Text:='Hora: '+TimeToStr(Time);
end;

procedure TFormRoteiro.Button3Click(Sender: TObject);
var     i: integer;     // variavel para controle do laço for next
        fim:integer; // limite final do laço de registro de itens
        produto: real; // codigo do produto que irá variar
begin
        Fim:=StrToINt(EdRepete.Text);
        // Abrir Cupom Fiscal
        Barra.Panels[2].Text:='Abrindo Cupom Fiscal';
        StrPCopy(Comando,'*01');
        MandaComando;
        refresh;

        produto:=StrToFloat(EdProduto.Text);
        // Registrar item de venda
        for i:=1 to fim do
        begin
                Barra.Panels[2].Text:='Registrando item ' +FloatToStr(Produto);
                refresh;

                StrPCopy(Comando,'*02|'+edQtde.text+'|'+Format('%13s',[FloatTostr(produto)])+'|'+EdPreco2.Text+'|UN|'+EdTaxa2.Text+'|'+EdDescricao2.Text);
                if not MandaComando then exit;

                produto:=produto+1;  // soma 1 para alterar o codigo do produto
        end;

        // Obtem o Total do Cupom fiscal - Status Documento
        StrPCopy(Comando,'*34|L1');
        MandaComando;

        // Totaliza o CUpom Fiscal
        Barra.Panels[2].Text:='Totalizando Cupom Fiscal';
        StrPCopy(Comando,'*06|'+copy(edPagamento.text,1,2)+'|'+FormatFloat('0.00',StrToFloat(StatusDocumento.Total_a_Pagar)/100) );
        MandaComando;


        // Fecha Cupom
        Barra.Panels[2].Text:='Fechando Cupom Fiscal'; refresh;
        StrPCopy(Comando,'*07|'+chr(22)+chr(171)+chr(22)+chr(167)+'OBRIGADO!'+chr(22)+chr(166)+chr(13)+chr(10)+'Volte sempre!'+chr(13)+chr(10)+'www.sweda.com.br|2');
        MandaComando;
        edProduto.Text:=Format('%13s',[FloatTostr(produto)]);
        
end;

procedure TFormRoteiro.EdRepeteExit(Sender: TObject);
begin
        EdRepete.Text:=FormatFloat('000',StrToFloat(EdRepete.Text));
end;

function TFormRoteiro.MensagemError(CodError:string):String;
var cod:integer;
begin
        cod := StrToInt(CodError);

        case Cod of
        00: MensagemError:=CodError+'-'+'Comando efetuado com sucesso!';
        02: MensagemError:=CodError+'-'+'Não há documento para cancelar.';
        04: MensagemError:=CodError+'-'+'Pagamento não finalizado.';
        06: MensagemError:=CodError+'-'+'Indicado Item inválido.';
        07: MensagemError:=CodError+'-'+'Item já cancelado.';
        08: MensagemError:=CodError+'-'+'Apurado total igual a zero.';
        15: MensagemError:=CodError+'-'+'Cancelamento de acréscimo no subtotal';
        21: MensagemError:=CodError+'-'+'Alíquota não programada.';
        23: MensagemError:=CodError+'-'+'Erro de Sintaxe!';
        31: MensagemError:=CodError+'-'+'Faixa inválida!';
        42: MensagemError:=CodError+'-'+'Excede o valor do item.';
        51: MensagemError:=CodError+'-'+'Não foi possivel acumulação em um dos totalizadores';
        53: MensagemError:=CodError+'-'+'Impossibilita o cancelamento.';
        56: MensagemError:=CodError+'-'+'Iniciando Intervenção Técnica.';
        57: MensagemError:=CodError+'-'+'Encerrando Intervenção Técnica.';
        58: MensagemError:=CodError+'-'+'Comando ou operação inválida!';
        59: MensagemError:=CodError+'-'+'Dia encerrado!';
        60: MensagemError:=CodError+'-'+'É necessário emitir Redução Z!';
        61: MensagemError:=CodError+'-'+'O ECF está em Modo Intervenção Técnica!';
        124: MensagemError:=CodError+'-'+'Tampa Aberta!';
        125: MensagemError:=CodError+'-'+'Sem papel!';
        126: MensagemError:=CodError+'-'+'Avançando papel!';
        127: MensagemError:=CodError+'-'+'Substituir bobina!';
        134: MensagemError:=CodError+'-'+'Transmissão via porta serial abortada.';
        216: MensagemError:=CodError+'-'+'Programar o relógio.';
        end;
end;

function TFormRoteiro.MandaComando:Boolean;
begin
        retorno:= -3;
        while retorno = -3 do
        begin
                retorno := ECFWriteSerial(Comando,Strlen(Comando),'serial');
                if retorno = -3 then ShowMessage('Aguarde ...');
        end;

        if retorno <> 0 then
        begin
                ShowMessage('Erro no envio do comando');
                Result:=False;
        end
        else Result:=ObtemResposta();
end;

function TFormRoteiro.ObtemResposta:Boolean;
var capturatexto:boolean;
begin
        Resposta:=#0; capturatexto:=false;
        CopyMemory(@Conteudo,@Resposta,94);
        CopyMemory(@Header,@Resposta,4);
        CopyMemory(@Status,@Resposta,515);
        while true do
        begin
                Resposta:=#0;
                CopyMemory(@LeituraOnLine,@Resposta,512);
                if not (copy(comando,2,2)='34') then FormAviso.Show;
                FormAviso.Refresh;
                retorno := ECFReadSerial(Resposta,1200,'serial');
                if retorno = -1 then ShowMessage('Falha na comunicação')
                else if retorno = -2 then ShowMessage('Excedido o tamanho da resposta')
                else if retorno = -3 then break //Protocolo ocupado
                else if retorno > 0 then
                begin
                        CopyMemory(@Header,@Resposta,4);
                        if ( Header.Tarefa='00' ) and ( Header.Tipo='!' ) then // resposta de alteração de status
                        begin
                                CopyMemory(@Conteudo,@Resposta,retorno);
                                if Conteudo.Mensagem <> '0000' then showMessage(MensagemError(Conteudo.Mensagem))
                                else FormAviso.Close;
                                FormAviso.Refresh;
                        end
                        else if (( Header.Tarefa='44' ) OR (Header.Tarefa = '45') ) and ( Header.Tipo='!' ) then // resposta de alteração de status
                        begin
                                CopyMemory(@Conteudo,@Resposta,retorno);
                                if (Conteudo.mensagem = '0228') then // inicio da transmissão do texto
                                        capturatexto:=true;

                                if (Conteudo.mensagem = '0217') then // percentual de processmento
                                begin
                                        ProgressBar1.visible:=true;
                                        ProgressBar1.position:=StrToInt(Copy(Conteudo.adicional,1,3));
                                        ProgressBar1.Refresh;
                                end

                        end
                        else if (( Header.Tarefa='44' ) OR (Header.Tarefa = '45') ) and ( Header.Tipo='>' ) then // resposta de alteração de status
                        begin
                                if capturatexto then begin
                                        CopyMemory(@LeituraOnLine,@Resposta,retorno);
                                        FormTextoOnLine.Show;
                                        FormTextoOnLine.TextoOnLine.Text:= FormTextoOnLine.TextoOnLine.Text+LeituraOnLine.informacao;
                                        FormTextoOnLine.TextoOnLine.Refresh;
                                end
                        end
                        else if ( Header.Tarefa='34') and ( Header.Tipo='+') then // Retorno de Status
                        begin
                                CopyMemory(@Conteudo,@Resposta,retorno);
                                Barra.Panels[3].Text:=MensagemError(Conteudo.mensagem);
                        end
                        else if Header.Tarefa='34' then // Retorno de Status
                        begin
                                CopyMemory(@Status,@Resposta,retorno);
                                if ( status.tipo='B')  and ( status.secao = '0004') then // legendas dos meios de pagamento
                                        CopyMemory(@Pagamento,@Status.Informacao,420)
                                else if ( status.tipo='D')  and ( status.secao = '0004') then // aliquotas de ICMS
                                        CopyMemory(@Aliquota_ICMS,@Status.Informacao,60)
                                else if ( status.tipo='E')  and ( status.secao = '0004') then // aliquotas de ISS
                                        CopyMemory(@Aliquota_ISS,@Status.Informacao,60)
                                else if ( status.tipo='L')  and ( status.secao = '0001') then // totais do Cupom em Emissão
                                        CopyMemory(@StatusDocumento,@Status.Informacao,77)
                                else if ( status.tipo='I')  and ( status.secao = '0001') then // totais do Cupom em Emissão
                                        CopyMemory(@StatusModelo,@Status.Informacao,77)
                                else if ( status.tipo='S')  and ( status.secao = '0001') then // totais do Cupom em Emissão
                                        CopyMemory(@StatusMFD,@Status.Informacao,190);
                        end
                        else
                        begin
                                CopyMemory(@Conteudo,@Resposta,retorno);
                                Barra.Panels[3].Text:=MensagemError(conteudo.mensagem);
                        end;
                end;
                if (Header.Tarefa= Copy(comando,2,2)) and ((Header.Tipo='+') or (Header.Tipo='-') ) then
                        Break
        end;
        FormAviso.Close;
        FormAviso.Refresh;

        ProgressBar1.visible:=false;
        if Header.Tipo='+' then Result := True
        else  begin
                showMessage('Erro: '+ Conteudo.Mensagem);
                ObtemResposta := False;
        end;


end;

procedure TFormRoteiro.EdnitemExit(Sender: TObject);
begin
       EdNitem.Text:=FormatFloat('000',StrToFloat(EdNitem.Text));
end;

procedure TFormRoteiro.Button1Click(Sender: TObject);
var     i: integer;     // variavel para controle do laço for next
        fim:integer; // limite final do laço de cancelamento de itens
begin
        if RB_Cancela1item.Checked then
        begin
                Barra.Panels[2].Text:='Cancelamento do item' + EdNitem.text;

                StrPCopy(Comando,'*05|'+EdNitem.Text);
                MandaComando;
        end
        else if RB_CancelaTodos.Checked then
        begin
                // Obtem o Total de itens - Status Documento
                StrPCopy(Comando,'*34|L1');
                MandaComando;
                EdNitem.Text:=StatusDocumento.Itens_registrados;
                refresh;

                Fim:=StrToINt(StatusDocumento.Itens_registrados);
                for i:=1 to fim do
                begin
                        Barra.Panels[2].Text:='Cancelando item ' +FloatToStr(i);
                        refresh;

                        StrPCopy(Comando,'*05|'+inttostr(i));
                        if not MandaComando then exit;

                end;
        end;
end;

procedure TFormRoteiro.SpeedButton1Click(Sender: TObject);
begin
        EdDescricao2.Text:=Acentuacao;
        EdPreco2.Text:=maximo;
        EdQtde.Text:=qtde999;
end;

procedure TFormRoteiro.EdPreco2Exit(Sender: TObject);
begin
        if (pos(',',EdPreco2.Text)=0) and ( pos('.',EdPreco2.Text)=0) then
                EdPreco2.Text:=EdPreco2.Text+',';
        EdPreco2.Text:=FormatFloat('0.00',StrToFloat(EdPreco2.Text));

end;

procedure TFormRoteiro.EdQtdeExit(Sender: TObject);
begin
        if (pos(',',EdQtde.Text)=0) and (pos('.',EdQtde.Text)=0) then
                EdQtde.Text:=EdQtde.Text+',';
        EdQtde.Text:=FormatFloat('0.000',StrToFloat(EdQTde.Text));
end;

procedure TFormRoteiro.RB_MF_DataClick(Sender: TObject);
begin
        if RB_MF_Data.Checked then
        begin
                edParamIni.Text:= FormatDateTime('dd/mm/yy',now);
                edParamFim.Text:= FormatDateTime('dd/mm/yy',now);
        end;
end;

procedure TFormRoteiro.RB_MF_RZClick(Sender: TObject);
begin
        if RB_MF_RZ.Checked then
        begin
                try
                        edParamIni.Text:= FormatFloat('0000',StrToFloat(EdParamini.Text));
                except
                        Edparamini.text:='0000';
                end;
                try
                        edParamFim.Text:= FormatFloat('0000',StrToFloat(EdParamfim.Text));
                except
                        EdparamFim.text:='9999';
                end;
        end;
end;

procedure TFormRoteiro.Button4Click(Sender: TObject);
var simples:array[0..2] of Char;
begin
        if MF_Simplificada.Checked then Simples:='|S'
        else Simples:=#0;
        Barra.Panels[2].Text:='Emissão da Leitura da MF';
        refresh;

        if RB_MF_RZ.Checked then StrPcopy(Comando,'*17|'+EdParamIni.text+'|'+EdParamFim.Text+simples)
        else StrPcopy(Comando,'*18|'+EdParamIni.text+'|'+EdParamFim.Text+simples);
        if not MandaComando then exit;
end;

procedure TFormRoteiro.Button6Click(Sender: TObject);
begin
        Barra.Panels[2].Text:='Cancela Documento';
        StrPCopy(Comando,'*08');
        MandaComando;

end;

procedure TFormRoteiro.Button7Click(Sender: TObject);
begin
        Barra.Panels[2].Text:='Leitura X';
        StrPCopy(Comando,'*15');
        MandaComando;

end;

procedure TFormRoteiro.PageControl1Change(Sender: TObject);
begin
        If PageControl1.ActivePage=ECF then
        begin
                memo1.visible:=false;
                memo1.clear;
//                Barra.Panels[2].Text:='Capturando informações do modelo';
//                StrPCopy(Comando,'*34|I1');
//                if not MandaComando then exit;
                memo1.Lines.Add('Marca: '+StatusModelo.marca);
                memo1.Lines.Add('Modelo: '+StatusModelo.modelo);
                memo1.Lines.Add('Tipo: '+StatusModelo.tipo);
                memo1.Lines.Add('No. de Série: '+StatusModelo.Serie);
                memo1.Lines.Add('Firmware: '+StatusModelo.firmware);
                memo1.Lines.Add('Protocolo: '+StatusModelo.protocolo);

                memo1.Lines.Add(' ');

                Barra.Panels[2].Text:='Capturando informações da MFD';
                StrPCopy(Comando,'*34|S1');
                if not MandaComando then exit;

                capacidadeb:=StrtoFloat(StatusMFD.Capacidade) * 1024 * 1024;
                consumob:=StrToFloat(StatusMFD.PonteiroA)  + StrToFloat(StatusMFD.PonteiroB);
                consumop:=(Consumob / Capacidadeb)*100;

                memo1.Lines.Add('MFD: '+StatusMFD.serie);
                memo1.Lines.Add('CNPJ: '+StatusMFD.CNPJ);
                memo1.Lines.Add('I.E.: '+StatusMFD.IE);
                memo1.Lines.Add('I.M.: '+StatusMFD.IM);
                memo1.Lines.Add(' ');
                memo1.Lines.Add('Capacidade: '+StatusMFD.capacidade+' MB');
                memo1.Lines.Add('Consumo: '+floattostr(consumob)+' bytes ('+Formatfloat ('0.00',consumop)+' %)');
                memo1.visible:=true;
        end;
end;

procedure TFormRoteiro.Button8Click(Sender: TObject);
var hverao:char;
begin
        if CB_HVerao.Checked then hverao:='v'
        else hverao:=#0;
        Barra.Panels[2].Text:='Redução Z';
        StrPCopy(Comando,'*16|'+Eddataz.text+'|'+EdHoraz.Text+hverao);
        MandaComando;

end;

procedure TFormRoteiro.RDZShow(Sender: TObject);
begin
        EdDataZ.Text:=FormatDateTime('dd/mm/yyyy',Now);
        edHoraZ.Text:= FormatDateTime('hh:mm:ss',Now);

end;

procedure TFormRoteiro.RB_MFD_DataClick(Sender: TObject);
begin
        if RB_MFD_Data.Checked then
        begin
                edParamIniMFD.Text:= FormatDateTime('dd/mm/yyyy',now);
                edParamFimMFD.Text:= FormatDateTime('dd/mm/yyyy',now);
        end;

end;

procedure TFormRoteiro.RB_MFD_COOClick(Sender: TObject);
begin
        if RB_MFD_COO.Checked then
        begin
                try
                        edParamIniMFD.Text:= FormatFloat('000000',StrToFloat(EdParaminiMFD.Text));
                except
                        EdparaminiMFD.text:='000000';
                end;
                try
                        edParamFimMFD.Text:= FormatFloat('000000',StrToFloat(EdParamfimMFD.Text));
                except
                        EdparamFimMFD.text:='999999';
                end;
        end;

end;

procedure TFormRoteiro.Button9Click(Sender: TObject);
var complemento: string;
begin
        Barra.Panels[2].Text:='Emissão da Memória de Fita-Detalhe';
        Barra.Panels[3].Text:=' ';
        FormTextoOnLine.TextoOnLine.Clear;
        refresh;

        if CBcaptura.Checked then Complemento:='|TXT|CPWIN'
        else complemento:=#0;
        if RB_MFD_COO.Checked then StrPcopy(Comando,'*44|'+EdParamIniMFD.text+'|'+EdParamFimMFD.Text+'|'+complemento)
        else StrPcopy(Comando,'*45|'+EdParamIniMFD.text+'|'+EdParamFimMFD.Text+complemento);

        MandaComando;

end;

procedure TFormRoteiro.Button10Click(Sender: TObject);
var     i: integer;     // variavel para controle do laço for next
        fim:integer; // limite final do laço de registro de itens
        produto: real; // codigo do produto que irá variar
begin
        i:=1;
        Fim:=StrToINt(EdRepete.Text);
        produto:=StrToFloat(EdProduto.Text);

        for i:=1 to fim do
        begin
                // Abrir Cupom Fiscal
                Barra.Panels[2].Text:='Abrindo Cupom Fiscal';
                StrPCopy(Comando,'*01');
                MandaComando;
                refresh;

                // Registrar item de venda
                Barra.Panels[2].Text:='Registrando item ' +FloatToStr(Produto);
                refresh;

                StrPCopy(Comando,'*02|'+edQtde.text+'|'+Format('%13s',[FloatTostr(produto)])+'|'+EdPreco2.Text+'|UN|'+EdTaxa2.Text+'|'+EdDescricao2.Text);
                if not MandaComando then break;

                produto:=produto+1;  // soma 1 para alterar o codigo do produto

                // Obtem o Total do Cupom fiscal - Status Documento
                StrPCopy(Comando,'*34|L1');
                MandaComando;

                // Totaliza o CUpom Fiscal
                Barra.Panels[2].Text:='Totalizando Cupom Fiscal';
                StrPCopy(Comando,'*06|'+copy(edPagamento.text,1,2)+'|'+FormatFloat('0.00',StrToFloat(StatusDocumento.Total_a_Pagar)/100) );
                MandaComando;


                // Fecha Cupom
                Barra.Panels[2].Text:='Fechando Cupom Fiscal'; refresh;
                StrPCopy(Comando,'*07|'+chr(22)+chr(171)+chr(22)+chr(167)+'OBRIGADO!'+chr(22)+chr(166)+chr(13)+chr(10)+'Volte sempre!'+chr(13)+chr(10)+'www.sweda.com.br|2');
                MandaComando;
                edProduto.Text:=Format('%13s',[FloatTostr(produto)]);
        end;

        edProduto.Text:=Format('%13s',[FloatTostr(produto)]);
end;


end.


